﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Kontrolki;
using KPWeb.Class;
using KPWeb.Data;
using KPWeb.Function;



namespace KPWeb.Jednostka
{

    public partial class WnioskiUrlopoweJednostkaTworzZaPracownika : KPPage
    {
        private short RodzajNarzedzia
        {

            get
            {
                return short.Parse(ViewState["RodzajNarzedzia"].ToString());
            }
            set
            {
                ViewState["RodzajNarzedzia"] = value;

            }
        }
        private void initOpisyObecnoscWPracy()
        {
            lNieobecna.Visible = false;
            lNieobecnaOkres.Visible = false;
            lObecna.Visible = false;
        }

        private void initOsoby(int jednostkaID)
        {
            dOsobyJednostka.Items.Clear();
            dOsobyJednostka.Items.Add(new ListItem() { Text = Stale.wybierzOsobe, Value = Stale.wybierzOsobe });

            dOsobyJednostkaLista.Items.Clear();
            dOsobyJednostkaLista.Items.Add(new ListItem() { Text = Stale.wszystkie, Value = "0" });

            dOsobyZastepstwo.Items.Clear();
            dOsobyZastepstwo.Items.Add(new ListItem() { Text = Stale.wybierzZastepce, Value = "0" });
            Model model = new Model();
            foreach (vKP_OsobyListaObecnosci item in model.GetListaObecnosci(int.Parse(Current.JednostkaID)))
            {
                dOsobyJednostka.Items.Add(new ListItem()
                {
                    Text = FunctionGlobal.UppercaseFirstWords(item.NazwiskoImie), Value = item.OsobaID.ToString()
                });
                dOsobyJednostkaLista.Items.Add(new ListItem()
                {
                    Text = FunctionGlobal.UppercaseFirstWords(item.NazwiskoImie),
                    Value = item.OsobaID.ToString()
                });
                dOsobyZastepstwo.Items.Add(new ListItem()
                  { Text = FunctionGlobal.UppercaseFirstWords(item.NazwiskoImie), Value = item.OsobaID.ToString() });
            }
            dOsobyJednostka.SelectedIndex = 0;
            dOsobyJednostkaLista.SelectedIndex = 0;

            dNieobecnosciRodzaj.Items.Clear();
            dNieobecnosciRodzaj.Items.Add(new ListItem() { Text = Stale.wszystkie, Value = "0" });
            foreach (vLex_TypNieobecnosciUrlopu u in UrlopyK.GetListaTypNieobecnosciUrlopu().OrderBy(a => a.TypNieobecnosciUrlopuNazwa))
                            {
                               dNieobecnosciRodzaj.Items.Add(new ListItem() { Text = u.TypNieobecnosciUrlopuNazwa, Value = u.TypNieobecnosciUrlopuID.ToString() });
                            }
            dNieobecnosciRodzaj.SelectedIndex = 0;

        }
        
        private void komunikatError(int kod)//, int iT, int iID)
        {
            fError.Visible = true;
            switch (kod)
            {
                case -2: Error2.Visible = true;
                    break;
                case -3: Error3.Visible = true;
                    break;
                default: fError.Visible = false;
                    break;
            }
        }
     

        public static vKP_DokumentyWnioskiUrlopowe[] GetWnioskiUrlopowe( int osobaID)
        {
            using (DBContainer db = new DBContainer())
            {

                return (from wiz in db.vKP_DokumentyWnioskiUrlopowe.Where(a => a.OsobaID == osobaID).OrderByDescending(a=>a.OdData)
                        select wiz).ToArray();
            }
        }
      
        protected void Page_Load(object sender, EventArgs e)
        {
            fError.Visible = false;
            Error2.Visible = false;
            Error3.Visible = false;
            initOpisyObecnoscWPracy();

            RodzajNarzedzia = short.Parse(Request["value"]);
       
            if (!IsPostBack)
            {
                lS.Enabled = false;
                lP.Enabled = false;
                lI.Enabled = false;


                this.CalendarUC1.AllowHolidaysChecking = true;
                this.CalendarUC1.DateStart = DateTime.Now.Date;

                List<DateTime> l = new List<DateTime>();
                foreach (var item in Kalendarz.GetSwieta(DateTime.Now.Date.Year))
                {
                    l.Add(new DateTime(item.year, item.month, item.day));
                }
                this.CalendarUC1.Holidays = l.ToArray();
                dTypUrlopu.Items.Clear();
                foreach (vLex_TypNieobecnosciUrlopu u in UrlopyK.GetListaTypUrlopu().OrderBy(a => a.TypNieobecnosciUrlopuNazwa))
                {
                    this.dTypUrlopu.Items.Add(new ListItem() { Text = u.TypNieobecnosciUrlopuNazwa, Value = u.TypNieobecnosciUrlopuID.ToString() });
                }
                dTypUrlopu.SelectedValue = Stale.urlopInic;
                CalendarUC1.ClearSelected();



                dTypUrlopu.Items.Clear();
                switch (RodzajNarzedzia)
                {
                    case 1://Urlopy
                        bInneNieobecnosciZapisz.Visible = false;
                        bWniosekUrlopowyElektroniczny.Visible = true;
                        bWniosekUrlopowyPapierowy.Visible = true;
                        foreach (vLex_TypNieobecnosciUrlopu u in UrlopyK.GetListaTypUrlopu().OrderBy(a => a.TypNieobecnosciUrlopuNazwa))
                            {
                                this.dTypUrlopu.Items.Add(new ListItem() { Text = u.TypNieobecnosciUrlopuNazwa, Value = u.TypNieobecnosciUrlopuID.ToString() });
                            }
                        dTypUrlopu.SelectedValue = Stale.urlopInic;
                        break;
                    case 2://Inne nieobecności
                        bInneNieobecnosciZapisz.Visible = true;
                        bWniosekUrlopowyElektroniczny.Visible = false;
                        bWniosekUrlopowyPapierowy.Visible = false;
                        foreach (vLex_TypNieobecnosciUrlopu u in UrlopyK.GetListaTypNieobecnosciNieUrlop().OrderBy(a => a.TypNieobecnosciUrlopuNazwa))
                            {
                                this.dTypUrlopu.Items.Add(new ListItem() { Text = u.TypNieobecnosciUrlopuNazwa, Value = u.TypNieobecnosciUrlopuID.ToString() });
                            }
                            dTypUrlopu.SelectedValue = Stale.nieobecnoscInic;
                        break;
                }
      
                tData.Text = String.Format("{0:yyyy-MM-dd}", DateTime.Now);
                hJednostkaID.Value = (Model.GetJednostkaGlownaDlaJednostki(int.Parse(Current.JednostkaID))).ToString();
                initOsoby(int.Parse(hJednostkaID.Value));
                dYear.Items.Clear();
                foreach (short item in Kalendarz.GetYearGdzieWpisanoSwieta())
                {
                    this.dYear.Items.Add(item.ToString());
                }
                dYear.SelectedValue = DateTime.Now.Year.ToString();
            }
            else
            {
                this.CalendarUC1.RenderCalendar();
                tZaznaczone.Text = "";
                tRobocze.Text = "";
            }
        }

       
  protected void btnKasujClick(object sender, EventArgs e)
        {
         
            int outProc =  UrlopyK.DeleteWniosekUrlopowy(
                           int.Parse(((Button)sender).CommandArgument.ToString()));
            if (outProc != 0) Error2.Visible = true;
            this.ListView1.DataBind();
        
        }

  protected void btnDoKadrClick(object sender, EventArgs e)
  {
     
      int outProc = UrlopyK.UpdateWniosekUrlopowy(
                     int.Parse(((Button)sender).CommandArgument.ToString()),1,2);
      if (outProc != 0) Error2.Visible = true;
      this.ListView1.DataBind();
 
  }

  protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
  {
      string sTemp1 = ((Label)e.Item.FindControl("Zastepstwo")).Text;
      string sTemp2 = ((Label)e.Item.FindControl("NazwiskoImie")).Text;
      ((Label)e.Item.FindControl("Zastepstwo")).Text = FunctionGlobal.UppercaseFirstWords(sTemp1);
      ((Label)e.Item.FindControl("NazwiskoImie")).Text = FunctionGlobal.UppercaseFirstWords(sTemp2);
  }


  protected void LinkButton1_Click(object sender, EventArgs e)
  {
      Server.Transfer("~/Zestawienia/ToDo1.aspx");
  }

  protected void lKartaPracy_Click(object sender, EventArgs e)
  {
      Server.Transfer("~/Zestawienia/ToDo1.aspx");
  }
  protected void lInfo_Click(object sender, EventArgs e)
  {

      Osoby osoba1 = new Osoby();
      vKP_Osoby tempOsoba = osoba1.GetDaneOsoby(int.Parse(Current.JednostkaID), int.Parse(dOsobyJednostka.SelectedValue));
      if (tempOsoba == null)
      {
          lNieobecna.Text = "Brak danych osoby w bazie";
          return;
      }
      string nazwisko = HttpUtility.UrlEncode(tempOsoba.Nazwisko.ToString());
      string imie = HttpUtility.UrlEncode(tempOsoba.Imie.ToString());
      System.Diagnostics.Process.Start(
          "http://pracownicy.wum.edu.pl/PeopleSearch/Default.aspx?TabKey=0&TaskItemKey=2&Screen=1&SummaryFilter=(%26(givenName%3d" +
          imie + "*)(sn%3d" + nazwisko + "*))");
  }
  protected void lSzukaj_Click(object sender, EventArgs e)
  {
      if (tData.Text.Trim() == "")
      {
          lNieobecna.Text = Stale.zlaData;
          lNieobecna.Visible = true;
          lObecna.Visible = false;
          return;
      }
      UrlopyK urlop = new UrlopyK();
      vKP_DokumentyWnioskiUrlopowe item = urlop.GetObecnoscOsobyWnioskiUrlopowe(int.Parse(Current.JednostkaID), DateTime.Parse(tData.Text));
      lObecna.Visible = (item == null);
      lNieobecna.Visible = (item != null);
      lNieobecnaOkres.Visible = (item != null);
      string nazwisko = FunctionGlobal.UppercaseFirstWords(dOsobyJednostka.SelectedItem.Text);
      if (item == null)
      {
          lObecna.Text = nazwisko + ": " + tData.Text + Stale.brakInfoUrlop;
      }
      else
      {
          lNieobecna.Text = nazwisko + ": " + tData.Text + Stale.jestInfoUrlop;
          lNieobecnaOkres.Text = " Absencja od "
              + String.Format("{0:yyyy-MM-dd}", item.OdData) + " do " +
               String.Format("{0:yyyy-MM-dd}", item.DoData);
      }


  }
  //protected void lZastepca_Click(object sender, EventArgs e)
  //{
  //    //  Server.Transfer("~/Zestawienia/ToDo1.aspx");

  //    UrlopyK urlop = new UrlopyK();
  //    vKP_DokumentyWnioskiUrlopowe item = urlop.GetObecnoscOsobyWnioskiUrlopowe(int.Parse(dOsobyJednostka.SelectedValue), DateTime.Now);

  //    Osoby osoba1 = new Osoby();
  //    vKP_Osoby tempOsoba = osoba1.GetDaneOsoby(int.Parse(Current.JednostkaID), (int)item.ZastepstwoOsobaID);
  //    if (tempOsoba == null)
  //    {
  //        lNieobecna.Text = "Brak danych osoby w bazie";
  //        return;
  //    }
  //    string nazwisko = HttpUtility.UrlEncode(tempOsoba.Nazwisko.ToString());
  //    string imie = HttpUtility.UrlEncode(tempOsoba.Imie.ToString());
  //    System.Diagnostics.Process.Start(
  //        "http://pracownicy.wum.edu.pl/PeopleSearch/Default.aspx?TabKey=0&TaskItemKey=2&Screen=1&SummaryFilter=(%26(givenName%3d" +
  //        imie + "*)(sn%3d" + nazwisko + "*))");


  //}

  protected void lPlanyUrlopow_Click(object sender, EventArgs e)
  {
      if (Model.GetPlanowaneUrlopy(int.Parse(dOsobyJednostka.SelectedValue), (short)DateTime.Parse(tData.Text).Year).Count() == 0)
      {
          lNieobecna.Text = Stale.brakPlanowUrlopowych;
          lNieobecna.Visible = true;
          lObecna.Visible = false;
          return;
      }
      else
          Server.Transfer("~/Urlopy/PlanyUrlopow.aspx?value=0&osobaIDPlany=" + int.Parse(dOsobyJednostka.SelectedValue)
             + "&osobaJednostkaIDPlany=" + int.Parse(Current.JednostkaID));

  }


  //protected void dOsobyJednostka_SelectedIndexChanged(object sender, EventArgs e)
  //{
  //    initOpisyObecnoscWPracy();
  //}


  protected void dOsobyJednostka_SelectedIndexChanged(object sender, EventArgs e)
  {
      hOsobaID.Value = dOsobyJednostka.SelectedValue.ToString();
      if ((sender as DropDownList).SelectedIndex != 0)
      {
          lS.Enabled = true;
          lP.Enabled = true;
          lI.Enabled = true;
          fWniosekUrlopowy.Visible = true;
          fListaWnioskowUrlopowych.Visible = true;
      }
      else
      {
          lS.Enabled = false;
          lP.Enabled = false;
          lI.Enabled = false;
          fWniosekUrlopowy.Visible = false;
          fListaWnioskowUrlopowych.Visible = false;
      }
  }


  protected void bUrlopy_Click(object sender, EventArgs e)
  {
      Server.Transfer("~/Urlopy/WniosekUrlopowy.aspx?value=1");
  }



  protected void CalendarUC_UserControlRefreshedE(object sender, CalendarUC.ActionEvent e)
  {
      //tutaj odswiez u siebie dni
      if (sender == null) return;
      int iDni = (sender as CalendarUC).Selected.Count();
      tZaznaczone.Text = iDni.ToString();
      tRobocze.Text = Kalendarz.GetLiczbaDniRoboczych((sender as CalendarUC).Selected).ToString();

      if (e.ActionType == CalendarUC.ActionType.NextPrevMonth || e.ActionType == CalendarUC.ActionType.PageLoad)
      {
          this.CalendarUC1.ClearUnavailablePeriods();
          DateTime since = new DateTime((sender as CalendarUC).DateStart.Year, (sender as CalendarUC).DateStart.Month, 1);
          DateTime until = new DateTime(since.Year, since.Month, DateTime.DaysInMonth(since.Year, since.Month));

          DateTime zatrOd = DateTime.Parse(Current.DataZatrudnieniaOd);
          DateTime zatrDo = DateTime.Parse(Current.DataZatrudnieniaDo);

          if (zatrOd > since && zatrOd > until || zatrDo < since && zatrDo < until) (sender as CalendarUC).AddUnavailablePeriod(since, until);
          else
              if (zatrOd > since && zatrOd < until) (sender as CalendarUC).AddUnavailablePeriod(since, zatrOd.AddDays(-1));
          if (zatrDo > since && zatrDo < until) (sender as CalendarUC).AddUnavailablePeriod(zatrDo.AddDays(1), until);
      }
  }
  protected void zaznaczDniCalendar(DateTime d1, DateTime d2)
  {
      CalendarUC1.ClearSelected();

      List<DateTime> l = new List<DateTime>();
      for (DateTime d = d1; d <= d2; d = d.AddDays(1))
      {
          l.Add(new DateTime(d.Year, d.Month, d.Day));
      }
      CalendarUC1.Selected = l.ToArray();


      //       ViewState["Dates"] = CalendarUC1.Selected;


      tZaznaczone.Text = CalendarUC1.Selected.Count().ToString();
      tRobocze.Text = Kalendarz.GetLiczbaDniRoboczych(CalendarUC1.Selected).ToString();

  }
  protected void bDaty_Click(object sender, EventArgs e)
  {
      zaznaczDniCalendar(DateTime.Parse(tDataOd.Text), DateTime.Parse(tDataDo.Text));
  }
  protected void tData_Click(object sender, EventArgs e)
  {
      DateTime dd1;
      DateTime dd2;
      CalendarUC1.ClearSelected();
      if (DateTime.TryParse(tDataOd.Text, out dd1) && DateTime.TryParse(tDataDo.Text, out dd2))
          zaznaczDniCalendar(dd1, dd2);
  }
  protected bool sprawdzCiagloscOkresu(DateTime d1, DateTime d2)
  {
      for (DateTime d = d1; d <= d2; d = d.AddDays(1))
      {
          if (CalendarUC1.Selected.Where(a => a.Date == d).Count() == 0) return false;
      }
      return true;
  }
 
  protected int WniosekUrlopowUtworz(byte rodzaj)
  // 0 OK, 1 brak ciagłości okresu, 2 błą wyboru typu urlopu, 6 osoba=zastepca
  {
      if (CalendarUC1.Selected.Count() == 0) return -3;

      if (this.dOsobyZastepstwo.SelectedValue == dOsobyJednostka.SelectedValue) return -6;

      int iDni = CalendarUC1.Selected.Count();
      tZaznaczone.Text = iDni.ToString();
      tRobocze.Text = Kalendarz.GetLiczbaDniRoboczych(CalendarUC1.Selected).ToString();

      DateTime[] dMinMax = Kalendarz.GetMinMaxOkresu(CalendarUC1.Selected);
      int? iTemp = int.Parse(dOsobyZastepstwo.SelectedValue);
      iTemp = (iTemp == 0 ? null : iTemp);
      if (!sprawdzCiagloscOkresu(dMinMax[0], dMinMax[1])) return -1;

      int iT = UrlopyK.InsertWniosekUrlopowy(int.Parse(hOsobaID.Value), byte.Parse(dTypUrlopu.SelectedValue),
           iTemp, dMinMax[0], dMinMax[1], int.Parse(tRobocze.Text), rodzaj, 2);
      
      return iT; //Ostatni wiersz w procedurze
  }

  protected void WniosekUrlopowyElektroniczny_Click(object sender, System.EventArgs e)
  {
      // 1 elektroniczny
      if (dOsobyZastepstwo.SelectedItem.Text == Stale.wybierzZastepce && dTypUrlopu.SelectedValue != Stale.urlopNaZadanie)
      {
          komunikatError(-5);
          return;
      }

      int iTemp = WniosekUrlopowUtworz(1);

      if (iTemp < 0) komunikatError(iTemp); //Ostatni wiersz w procedurze
  }
  protected void WniosekUrlopowyPapierowy_Click(object sender, System.EventArgs e)
  {
      //2 papierowy
      int iTemp = WniosekUrlopowUtworz(2);

      if (iTemp < 0) komunikatError(iTemp); //Ostatni wiersz w procedurze
  }

    }
}